(function() {
   var f = J3D.F;
   var m = J3D.Matrix;
   var camera = m.perspective(50, 1, 0.1, 2000);
   var vectors = f.list(
     f.list(100, 100, 100, 1),
     f.list(100, -100, 100, 1),
     f.list(-100, -100, 100, 1),
     f.list(-100, 100, 100, 1),

     f.list(100, 100, -100, 1),
     f.list(100, -100, -100, 1),
     f.list(-100, -100, -100, 1),
     f.list(-100, 100, -100, 1)
   );
   
   var vecs = f.map(
     function(v) {
       return m.multiplyMatVec(camera, v);
     })(vectors);
   
   document.getElementById('result').innerHTML = 
     f.listToStr(vecs).replace(/]/gi, ']<br/>').
     replace(/\[\[/gi, '[<br/>[').replace(/ /g, ',');
    
   var v = f.map(
     function(v) {
       var x = f.fst(v);
       var y = v[1][0];
       var z = v[1][1][0];
       return f.list(120 + 10 * x / z, 120 + 10 * y / z);
     })(vecs);
   
   document.getElementById('result').innerHTML += 
     f.listToStr(v).replace(/]/gi, ']<br/>').
     replace(/\[\[/gi, '[<br/>[').replace(/ /g, ',');
   
   var ctx = document.getElementById('canvas').getContext('2d');
   ctx.fillStyle = 'orange';
   
   f.map(
     function(xy) {
       ctx.fillRect(xy[0], xy[1][0], 2, 2);
     })(v);
   
 })();
